/**
 * 双精度 64 位二进制格式。类似java,c#里面的double
1(正负)-11（2^11=2048=-1022到1023代表指数）-52(2^52代表小数)
公式：Number=(−1)sign⋅(1+mantissa)⋅2exponent

*/

//最大数字
// Number.MAX_VALUE 是如何得來的
// 64位浮點數，M部分最大爲52個1 + 被忽略的1，E部分最大爲 2046-1023 = 1023，

// 爲何不是 2047-1023 = 1024，由於這個1024要用來表示Infinity

// 因此最大的二進制數位 1.1111…1(小數點後面52個1) * 2 ^ 1023

// 在計算機中存儲形態爲 0 | 111 1111 1110 | 111111...111(52個1)
//(2**1023)*1.999999999999999
console.log(Number.MAX_VALUE);//1.7976931348623157e+308(1.79...*10^308)=2^1023
console.log(Number.MIN_VALUE);//5e-324

console.log(Number.MAX_SAFE_INTEGER);//最大的安全整数（2^53 - 1）=9007199254740991(16位)=9百万亿
console.log(Number.MIN_SAFE_INTEGER);//最小的安全整数-（2^53 - 1）=-9007199254740991(16位)=9百万亿

console.log(Number.MAX_VALUE>Number.MAX_SAFE_INTEGER)// true

//最小数字
//失去精准的数字
// 因为0.1+0.2长度为 57位，而实际才52位+1位正负，被四舍五入了
console.log(0.1+0.2);//0.30000000000000004
//快速解决方式,先乘100，再除100，（但是超过52位的小数，还是有问题）
console.log((0.1*100+0.2*100)/100);

// 0.1 -> "0.0001100110011001100110011001100110011001100110011001101" 精度 52 位
// 0.2 -> "0.001100110011001100110011001100110011001100110011001101"  精度 52 位
// 0.3 -> "0.010011001100110011001100110011001100110011001100110011"  精度 53 位
// 0.4 -> "0.01100110011001100110011001100110011001100110011001101"   精度 52 位
// 0.5 -> "0.1"
// 0.6 -> "0.10011001100110011001100110011001100110011001100110011"   精度 53 位
// 0.7 -> "0.1011001100110011001100110011001100110011001100110011"    精度 52 位
// 0.8 -> "0.1100110011001100110011001100110011001100110011001101"    精度 52 位
// 0.9 -> "0.11100110011001100110011001100110011001100110011001101"   精度 53 位

// 如何解决小数运算不准确的问题
// 小数运算不准是因为要计算的数字小数部分无法用二进制精确表示所导致，我们可以把小数转化成整数运算之后再变回小数来解决！


// 数字比较
123; // one-hundred twenty-three
123.0; // same
123 === 123.0; // true